package com.project.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.project.bean.*;
import com.project.service.IBuyCarService;
import com.project.service.IBuyInfoService;
import com.project.service.IBuyService;
import com.project.service.IGoodsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
@RestController
@RequestMapping("buy")
@Api(tags = "采购控制层")

public class BuyController {
    @Autowired
    private IGoodsService goodsService;
    @Autowired
    private IBuyCarService buyCarService;
    @Autowired
    private IBuyService buyService;
    @Autowired
    private IBuyInfoService buyInfoService;

    /**
     * 添加采购商品
     * 输入：操作类型（add/update），库存商品对象，图片上传对象，采购数量
     * 处理：
     * 1、判断操作类型是否为add，如果为add，完成库存商品添加。
     * 2、从session中，取出登陆用户对象。
     * 3、按用户ID，库存商品ID，查询采购车信息。
     * 如果采购车信息为null，则添加采购车记录
     * 如果采购车信息不为null，则累加采购车商品数量
     * 输出：ok
     * @param operation
     * @param goodsBean
     * @param face
     * @param num
     */
    @ApiOperation(value = "添加采购商品")
    @PostMapping("addGoods")
    public String addGoods(String operation, GoodsBean goodsBean, MultipartFile face, Integer num, HttpServletRequest request) throws IOException {
        UserBean loginUser = (UserBean) request.getSession().getAttribute("loginUser");
        //得到上传文件名
        String fileName = face.getOriginalFilename();
        //以时间毫秒数做文件名，后缀名不变，重命名上传文件，防止文件重名而覆盖
        fileName = System.currentTimeMillis() +fileName.substring(fileName.lastIndexOf("."));
        goodsBean.setImgPath(fileName);
        if (operation == "add"){
            goodsService.add(goodsBean);
        }
        BuyCarBean buyCarBean = buyCarService.findByUserGoods(loginUser.getId(), goodsBean.getId(),num);

        if (buyCarBean != null){
            buyCarService.updateById(buyCarBean.getId(), buyCarBean.getNum()+num,null);
        }else {
            buyCarBean = new BuyCarBean(0, num, goodsBean.getId(), loginUser.getId());
            buyCarService.add(buyCarBean);
        }

        //将上传文件的二进制数据，保存到指定文件中
        face.transferTo(new File("D:/aproj/secondstage/secondafter/src/face/"+fileName));

        return "ok";


    };
    /**
     * 删除采购车商品
     * 输入：采购车id
     * 处理：根据采购车Id删除采购车信息
     * 输出：ok
     * @param buyCarId
     */
    @ApiOperation(value = "删除采购车商品")
    @DeleteMapping("del")
    public String del(Integer buyCarId){
        buyCarService.del(buyCarId);
        return "ok";
    };

    /**
     * 查看该用户采购车所有记录
     * 输入：无
     * 处理：1、从session中取出登陆用户
     * 2、根据登陆用户id，查询采购车信息。采购车信息中，需要包含采购商品名称和品牌
     * 输出：采购车集合
     * 采购车信息：采购车编号，采购价，采购数量，库存商品外键，商品名称，品牌
     * @param userId
     * @return
     */
    @ApiOperation(value = "查看该用户采购车所有记录")
    @GetMapping("findByUserId")
    List<BuyCarBean> findByUserId(Integer userId,HttpServletRequest request){
        UserBean loginUser =(UserBean) request.getSession().getAttribute("loginUser");
        return buyCarService.findByUserId(loginUser.getId());
    };
    /**
     * 修改采购车信息
     * 输入：采购车id，采购价，采购数量
     * 处理：根据采购车id，修改采购价，采购数量，
     * 输出：ok
     * @param buyCarId 采购车id
     * @param newNum 新采购数量
     * @param newPrice 新采购价，动态条件
     */
    @ApiOperation(value = "修改采购车信息")
    @GetMapping("updateById")
    public String updateById(Integer buyCarId,Integer newNum,Integer newPrice){
        buyCarService.updateById(buyCarId, newNum, newPrice);
        return "ok";
    };


    /**
     * 入库
     * 输入：供应商名称
     * 处理：
     * 1、从session中，取出登陆用户
     * 2、完成采购信息的添加
     * 3、根据登陆用户id，查询购物车集合
     * 4、将采购信息的ID和购车集合，批量添加到采购明细中。同时修改库存商品的最新采购价，累加商品库存数量。
     * 5、按登陆用户ID，删除购物车信息
     * 输出：ok
     */
    @ApiOperation(value = "入库")
    @PostMapping("addBuy")
    public String addBuy(String supplierName,HttpServletRequest request){
        UserBean loginUser = (UserBean) request.getSession().getAttribute("loginUser");
        BuyBean buyBean = new BuyBean(supplierName, loginUser.getRealName());
        buyService.add(buyBean);
        List<BuyCarBean> buyCarList = buyCarService.findByUserId(loginUser.getId());
        for (BuyCarBean buyCar:buyCarList){
            buyInfoService.add(new BuyInfoBean(buyCar.getPrice(), buyCar.getNum(), buyCar.getGoodsId(), buyBean.getId()));
            goodsService.updateLastPrice( buyCar.getGoodsId(),buyCar.getPrice());
            goodsService.updateNum(buyCar.getGoodsId(), buyCar.getNum());
        }
        buyCarService.delMore(loginUser.getId());

        return "ok";
    };

    /**
     * 分页动态查询采购详情信息
     * 输入：页码，供应商名称，起始日期，结束日期
     * 处理：分页动态查询采购详情信息
     * 输出：分页对象
     * 采购信息：采购编号，采购日期，供应商名称，采购员真实姓名
     * @param pageNum
     * @param supplierName
     * @param startDate
     * @param endDate
     * @return
     */
    @ApiOperation(value = "分页动态查询采购详情信息")
    @PostMapping("cutFindByItem")
    public IPage<BuyBean> cutFindByItem(Integer pageNum, String supplierName, LocalDate startDate, LocalDate endDate){
        IPage<BuyBean> buyBeanIPage = buyService.cutFindByItem(pageNum, supplierName, startDate, endDate);
        return buyBeanIPage;
    };

    /**
     * 查询采购信息详情
     * 输入：采购信息Id
     * 处理：按采购详细Id，查询采购信息。同时查询采购明细信息
     * 输出：采购信息对象
     * 采购信息：采购编号，采购日期，供应商名称，采购员真实姓名，采购详情集合
     * 采购详情：采购详情编号、商品名称、品牌、采购价、采购数量
     * @param buyId
     * @return
     */
    @ApiOperation(value = "查询采购信息详情")
    @PostMapping("findById")
    public BuyBean findById(Integer buyId){
         return buyService.findById(buyId);
    };


}
